package com.tedu.day02.oop;

/**
 * 抽象类特点<补充>
 *             类：成员变量/成员方法/构造方法
 *             抽象类：成员变量/成员方法/构造方法
 *             成员方法：既可以变量，也可以常量
 *             构造方法:有，用于子类访问调用抽象【父】类的成员变量---赋值
 *             成员方法：既可以抽象，非抽象
 *             抽象方法与非抽象方法出现在抽象类问题
 *             A：抽象方法   【重写】强制要求子类完成父类的抽象方法
 *             B：非抽象方法 【拓展】子类继承事情，提升代码复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20; //成员变量：常量
    //Java强类型语言：大小写分明
    //  public int j=30;
    //构造方法：无参

    public abstract void  show();
    public Foo() {
        this(30) ;  //调用当前类对象的其他构造器
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法：抽象方法
    public void method(){
        System.out.println("Foo    method");
    }
}

//实现{子}类
class Goo extends Foo{
    public void  show(){
        System.out.println("Goo show");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[]args){
        //抽象类----继承----多态类----向上造型
        Foo f=new Goo();
        //①实例化----子类的构造器，默认存在无参构造器
        //在通过super()调用父类无参构造器
        //②执行抽象类无参构造器，发现有this（参数）调用本类其他有参数构造器
        //③this调用的同时，完成对抽象类中i进行赋值 i=30
        System.out.println(f.i); // ④输出：i的值  30
        //f.J=40;不可修改
        System.out.println(f.J);


        //------------------------------------------------
        f.show();  //输出：Goo  show   重写
        f.method();//输出：Goo  method  拓展【子类方法重写】
    }
}
/*拓展：abstract 关键共存问题*/
abstract class Aoo {
          // private abstract void show1();
          //public final abstract void show2();
         // public static abstract void show3();
//无意义：静态方法需要加语法块{}，抽象方法
}